IPropertyStorage-Compound File Implementation
The OLE
implementation of the Structured Storage architecture is called compound files.
Storage objects as implemented in compound files include an implementation of
both IPropertyStorage, the interface that manages a single persistent
property set, and IPropertySetStorage, the interface that manages groups
of persistent property sets.
To get a
pointer to the compound file implementation of IPropertyStorage, first
call StgCreateDocfile
When to Use
Use IPropertyStorage
to manage properties within a single property set. Its methods support reading,
writing, and deleting both properties and the optional string names that can be
associated with property identifiers. Other methods support the standard commit
and revert storage operations. There is also a method that allows you to set
times associated with the property storage, and another that permits the
assignment of a CLSID that can be used to associate other code, such as user
interface code, with the property set. Calling the Enum method supplies
a pointer to the compound file implementation of IEnumSTATPROPSTG, which
allows you to enumerate the properties in the set.
Remarks
The compound
file implementation of IPropertyStorage caches open property sets in
memory in order to improve performance. As a result, changes to a property set
are not written to the compound file until the Commit or Release
(last reference) methods are called.
IPropertyStorage::ReadMultiple
Reads the
properties specified in the rgpspec array and supplies the values of all
valid properties in the rgvar array of PROPVARIANTs. In the OLE compound
file implementation, duplicate property identifiers that refer to stream- or
storage-types result in multiple calls to IStorage::OpenStream or IStorage::OpenStorage
and the success or failure of ReadMultiple depends on the underlying
storage implementation s ability to share opens. Because in a compound file
STGM_SHARE_EXCLUSIVE is forced, multiple opens will fail. Opening the same
storage object more than once from the same parent storage is not supported.
The STGM_SHARE_EXCLUSIVE flag must be specified.
In addition,
to ensure thread-safe operation if the same stream- or storage-valued property
is requested multiple times through the same IPropertyStorage pointer in
the OLE compound file implementation, the open will succeed or fail depending
on whether or not the property is already open and on whether the underlying
file system handles multiple opens of a stream or storage. Thus, the ReadMultiple
operation on a stream- or storage-valued property always results in a call to IStorage::OpenStream
If the method
fails, the values written to rgvar[] are undefined. If some stream- or
storage-valued properties are opened successfully but an error occurs before
execution is complete, these should be released before the method returns.
IPropertyStorage::WriteMultiple
Writes the
properties specified in the rgpspec[] array, assigning them the
PROPVARIANT tags and values specified in rgvar[]. Properties that
already exist are assigned the specified PROPVARIANT values, and properties
that do not currently exist are created.
IPropertyStorage::DeleteMultiple
Deletes the
properties specified in the rgpspec[].
IPropertyStorage::ReadPropertyNames
Reads
existing string names associated with the property identifiers specified in the
rgpropid[] array.
IPropertyStorage::WritePropertyNames
Assigns
string names specified in the rglpwstrName array to property identifiers
specified in the rgpropid array.
IPropertyStorage::DeletePropertyNames
Deletes the
string names of the property identifiers specified in the rgpropid array by
writing NULL to the property name.
IPropertyStorage::SetClass
Sets the
CLSID field of the property set stream. In this implementation, setting the
CLSID on a non-simple property set (one that can legally contain storage- or
stream-valued properties, as described in IPropertySetStorage::Create)
also sets the CLSID on the underlying sub-storage so that it can be obtained
through a call to IStorage::Stat.
IPropertyStorage::Commit
For both
simple and non-simple property sets, flushes the memory image to the disk
subsystem. In addition, for non-simple transacted-mode property sets, this
method performs a commit (as in IStorage::Commit) on the property set.
IPropertyStorage::Revert
For
non-simple property sets only, calls the underlying storage's Revert
method and re-opens the 'contents' stream. For simple property sets, returns
E_OK.
IPropertyStorage::Enum
Constructs an
instance of IEnumSTATPROPSTG
IPropertyStorage::Stat
Fills in the
fields of a STATPROPSETSTG structure, which contains information about the
property set as a whole. On return, supplies a pointer to the structure. For
non-simple storage sets, this implementation calls IStorage::Stat
IPropertyStorage::SetTimes
For
non-simple property sets only, sets the times supported by the underlying
storage. The compound file storage implementation supports all three:
modification, access, and creation. This implementation of SetTimes
calls the IStorage::SetElementTimes method of the underlying storage to
retrieve these times.
See Also